package code.example.base.gc.gc3;

import code.example.base.gc.Person;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;

/**
 *   java -Xms512m -Xmx512m -XX:NewRatio=9 -XX:SurvivorRatio=3  -XX:+PrintTenuringDistribution -XX:-UseAdaptiveSizePolicy -cp ./lib/*:*.jar -XX:+PrintGCDetails -XX:+PrintHeapAtGC code.example.base.gc.gc3.TriggerGC3
 *
 *     -XX:NewRatio=9  年轻代大小设为51.2M
 *     -XX:SurvivorRatio=3 ：初始化survivor 为 年轻代的1/5 ,即 约 10M
 *     -XX:-UseAdaptiveSizePolicy：不允许自动调节survivor 大小
 *
 *   目的： 一直存活的对象大小survivor大小，存活对象一直不变，观察看GC情况
 *   场景：LinkedList 中存200000个元素，然后进入循环（添加500个，再移除新添加的500个），即LinkedList不断的进入移除元素，但一直保存着固定的 200000个元素，
 *   GC情况（见 in-old.context）:
        16次gc之前：survivor 都放不下存活的对象，不断的移动到OLD ,使old 空间由 0% --> 2%，回收后survivor 空间约99% ，
                     也就是survivor的99%+old的2% == 200000元素占用的空间。
        16次gc： survivor 一直存活的 99% ,年龄达到15，存入0ld中，old 增长到4%，回收后survivor 空间小于10%
       16次gc后，survivor 存活对象占0%-1%，即每次gc后 survivor都能存下存活对象，不再向old 中添加对象。
       每次minor gc 1-2ms之间。
       GC 情况很好。

 */
public class TriggerGC3 {

    public void test(){
        LinkedList data = new LinkedList();
        for(int i=0;i<200000;i++){//  增大10000
            Person person = new Person();
            person.setName("TestK"+i);
            data.offer(person);
        }
        for(;;){

            for(int i=0;i<500;i++){
                Person person = new Person();
                person.setName("TestK"+i);
                data.offer(person);//从后端添加
            }
            for(int i=0;i<500;i++){
                data.removeLast();//从后端删除
            }
            //LogFactory.getLog().info("queue.size="+data.size());
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            }catch (Exception e){}
        }
    }
    public static void main(String [] args){
        new TriggerGC3().test();
    }
}
